﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using AcadPos.Entity;
using AcadPosApp.Utilidades;
using System.Drawing;
using Microsoft.Reporting.WebForms;
using System.Data;

namespace AcadPosApp.ControlarMatricula
{
    public partial class FinanceiroMatricula : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                if (Session["idMatriculaSituacao"] != null)
                {
                    carregaFinanceiroMatricula();
                }
                else
                    Response.Redirect("MatriculaAluno.aspx");
            }
        }

        private void carregaFinanceiroMatricula()
        {
            MatriculaSessao matriculaSessao = (MatriculaSessao)Session["matriculaSessao"];
            Matricula matricula = new Matricula();
            matricula.MatriculaAluno = matriculaSessao.MatriculaAluno;
            matricula.IdTurma = matriculaSessao.IdTurma;
            DataTable dtDados = ControlClass.CNMatricula.listaFinanceiroMatricula(matricula);
            ViewState["dadosBoleto"] = dtDados;
            gvwFinanceiroAluno.DataSource = dtDados;
            gvwFinanceiroAluno.DataBind();
        }

        protected void btnParcelasRestantes_Click(object sender, EventArgs e)
        {
            pnlParcelasRestantes.Visible = true;
            pnlImpostoRenda.Visible = false;
            txtData1Vencimento.Text = string.Empty;
        }

        protected void btnConfirmar_Click(object sender, EventArgs e)
        {
            try
            {
                MatriculaSessao matriculaSessao = (MatriculaSessao)Session["matriculaSessao"];
                Matricula matricula = new Matricula();
                matricula.IdTurma = matriculaSessao.IdTurma;
                matricula.MatriculaAluno = matriculaSessao.MatriculaAluno;
                matricula.PrimeiroVencimento = Convert.ToDateTime(txtData1Vencimento.Text);

                if (ControlClass.CNMatricula.geraParcelasRestantes(matricula))
                {
                    ScriptManager.RegisterStartupScript(Page, Page.GetType(), "Alert", string.Format("alert('{0}');", Alertas.obterMsg((int)EnumAcadPos.Mensagem.SucessoInserir, "")), true);
                    carregaFinanceiroMatricula();
                    pnlParcelasRestantes.Visible = false;
                    matriculaSessao.Acao = "Inserir";
                    Session["matriculaSessao"] = matriculaSessao;
                    Session.Remove("idMatriculaSituacao");
                    Session["saidaPagina"] = "FC";
                    //Response.Redirect("MatriculaAluno.aspx");
                }
                else
                {
                    ScriptManager.RegisterStartupScript(Page, Page.GetType(), "Alert", string.Format("alert('{0}');", Alertas.obterMsg((int)EnumAcadPos.Mensagem.Nada, "Não foi possível realizar a operação. Por favor, verifique se todas as parcelas já foram geradas.")), true);
                }
            }
            catch (Exception ex)
            {
                ScriptManager.RegisterStartupScript(Page, Page.GetType(), "Alert", string.Format("alert('{0}');", Alertas.obterMsg((int)EnumAcadPos.Mensagem.Erro, ex.Message.ToString())), true);
            }

        }

        protected void gvwFinanceiroAluno_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            gvwFinanceiroAluno.PageIndex = e.NewPageIndex;
            carregaFinanceiroMatricula();
        }

        protected void gvwFinanceiroAluno_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                if (e.Row.Cells[6].Text.ToString() != "EM ABERTA")
                {
                    e.Row.Cells[7].Enabled = false;
                }
            }
        }

        protected void btnVoltarMatricula_Click(object sender, EventArgs e)
        {
            MatriculaSessao matriculaSessao = (MatriculaSessao)Session["matriculaSessao"];
            //matriculaSessao.Acao = "Excluir";
            Session["matriculaSessao"] = matriculaSessao;
            Session.Remove("idMatriculaSituacao");
            Session["saidaPagina"] = "FC";
            Response.Redirect("MatriculaAluno.aspx");
        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            pnlParcelasRestantes.Visible = false;
        }

        protected void btnFichaFinanceira_Click(object sender, EventArgs e)
        {
            pnlImpostoRenda.Visible = false;
            gerarRelFichaFinanceira();
        }

        private void gerarRelFichaFinanceira()
        {
            try
            {
                MatriculaSessao matriculaSessao = (MatriculaSessao)Session["matriculaSessao"];
                Matricula matricula = new Matricula();
                matricula.MatriculaAluno = matriculaSessao.MatriculaAluno;
                matricula.IdTurma = matriculaSessao.IdTurma;
                DataTable dtImp = ControlClass.CNMatricula.listaFinanceiroMatricula(matricula);

                if (dtImp.Rows.Count == 0)
                {
                    ScriptManager.RegisterStartupScript(Page, Page.GetType(), "Alert", "bootbox.alert('Não há registros à serem impressos!', function() {});", true);
                }
                else
                {
                    ReportViewer ReportViewer1 = new ReportViewer();
                    ReportViewer1.Reset();
                    ReportViewer1.ProcessingMode = ProcessingMode.Local;
                    ReportViewer1.LocalReport.ReportPath = Server.MapPath(@"~/Relatorios/relFichaFinanceira.rdlc");
                    ReportViewer1.LocalReport.DataSources.Clear();

                    ReportParameter rp_aluno = new ReportParameter("rp_aluno", Server.HtmlDecode(matriculaSessao.MatriculaAluno.ToString() + " - " + matriculaSessao.NomeAlunoCompleto.ToString()));
                    ReportParameter rp_curso = new ReportParameter("rp_curso", Server.HtmlDecode(matriculaSessao.NomeCurso.ToString()));
                    ReportParameter rp_turma = new ReportParameter("rp_turma", Server.HtmlDecode(matriculaSessao.Turma.ToString()));
                    ReportParameter rp_modulo = new ReportParameter("rp_modulo", Server.HtmlDecode(matriculaSessao.NomeModulo.ToString()));
                    ReportParameter rp_curriculo = new ReportParameter("rp_curriculo", Server.HtmlDecode(matriculaSessao.Curriculo.ToString()));

                    ReportParameter[] ReportParans = new ReportParameter[] { rp_aluno, rp_curso, rp_turma, rp_curriculo, rp_modulo };

                    ReportViewer1.LocalReport.SetParameters(ReportParans);

                    ReportDataSource rds1 = new ReportDataSource();
                    rds1.Name = "DataSet1";
                    rds1.Value = dtImp;

                    ReportDataSource rds2 = new ReportDataSource();
                    rds2.Name = "DataSet2";
                    rds2.Value = ControlClass.CNParametros.getCabecalhoRelatorio();

                    ReportViewer1.LocalReport.DataSources.Clear();
                    ReportViewer1.LocalReport.DataSources.Add(rds1);
                    ReportViewer1.LocalReport.DataSources.Add(rds2);
                    ReportViewer1.LocalReport.Refresh();

                    #region Gerar PDF
                    Warning[] warn = null;
                    string[] streamids = null;
                    string mimeType = "application/pdf";
                    string encoding = string.Empty;
                    string extension = string.Empty;
                    byte[] byteViewer;

                    byteViewer = ReportViewer1.LocalReport.Render("pdf", null, out mimeType, out encoding, out extension, out streamids, out warn);
                    Response.Buffer = true;
                    Response.Clear();
                    Response.ContentType = "application/pdf";
                    Response.AddHeader("content-disposition", "attachment; filename=FichaFinanceira.pdf");
                    Response.BinaryWrite(byteViewer);
                    Response.Flush();

                    Response.End();
                    Response.ClearContent();
                    #endregion
                }
            }
            catch (Exception)
            {
                ScriptManager.RegisterStartupScript(Page, Page.GetType(), "Alert", "bootbox.alert('Falha ao tentar gerar o relatório. Tente novamente!', function() {});", true);
            }
        }

        protected void btnBoletos_Click(object sender, EventArgs e)
        {
            pnlImpostoRenda.Visible = false;
            if (ViewState["dadosBoleto"] != null)
            {
                DataTable dtDados = (DataTable)ViewState["dadosBoleto"];
                DataView dtParcelas = dtDados.AsDataView();
                dtParcelas.RowFilter = "SITUACAO = 'EM ABERTA'";

                if (dtParcelas.Count > 0)
                {
                    Session["dadosParcelas"] = dtParcelas.ToTable();
                    Session["tipoBoleto"] = "PAGAMENTO PARCELAS";
                    MatriculaSessao matriculaSessao = (MatriculaSessao)Session["matriculaSessao"];
                    Session["InformacoesBoleto"] = Server.HtmlDecode("Curso: " + matriculaSessao.NomeCurso + "\nMódulo: " + matriculaSessao.NomeModulo);
                    ScriptManager.RegisterStartupScript(Page, typeof(Page), "OpenWindow", "window.open('../Boletos/boletoBanese.aspx', '_blank');", true);
                }
                else
                {
                    ScriptManager.RegisterStartupScript(Page, Page.GetType(), "Alert", "bootbox.alert('Não foram localizadas parcelas à serem pagas!', function() {});", true);
                }
            }
        }

        protected void gvwFinanceiroAluno_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                int index = int.Parse((String)e.CommandArgument);
                if (e.CommandName == "boleto")
                {
                    DataTable dtDados = (DataTable)ViewState["dadosBoleto"];
                    DataView dtParcelas = dtDados.AsDataView();
                    dtParcelas.RowFilter = "NOSSO_NUMERO = " + gvwFinanceiroAluno.DataKeys[index]["NOSSO_NUMERO"].ToString();
                    if (dtParcelas.Count > 0)
                    {
                        Session["dadosParcelas"] = dtParcelas.ToTable();
                        Session["tipoBoleto"] = "PAGAMENTO PARCELAS";
                        MatriculaSessao matriculaSessao = (MatriculaSessao)Session["matriculaSessao"];
                        Session["InformacoesBoleto"] = Server.HtmlDecode("Curso: " + matriculaSessao.NomeCurso + "\nMódulo: " + matriculaSessao.NomeModulo);
                        ScriptManager.RegisterStartupScript(Page, typeof(Page), "OpenWindow", "window.open('../Boletos/boletoBanese.aspx', '_blank');", true);
                    }
                    else
                    {
                        ScriptManager.RegisterStartupScript(Page, Page.GetType(), "Alert", "bootbox.alert('Não foram localizadas parcelas à serem pagas!', function() {});", true);
                    }
                }
            }
            catch (Exception)
            {


            }

        }

        protected void gvwFinanceiroAluno_RowCreated(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                ImageButton button = (ImageButton)e.Row.FindControl("ImgBoleto");
                button.CommandArgument = e.Row.RowIndex.ToString();
            }
        }

        protected void btnImpostoRenda_Click(object sender, EventArgs e)
        {
            pnlImpostoRenda.Visible = true;
            pnlParcelasRestantes.Visible = false;
            ddlAno.Items.Clear();
            for (int i = 2010; i <= DateTime.Now.Year; i++)
            {
                ddlAno.Items.Add(i.ToString());
            }
            ddlAno.SelectedIndex = ((DateTime.Now.Year) - 2010) - 1;
        }

        protected void btnImprimir_Click(object sender, EventArgs e)
        {
            MatriculaSessao matriculaSessao = (MatriculaSessao)Session["matriculaSessao"];
            int ano = Convert.ToInt32(ddlAno.SelectedValue);
            double valor = ControlClass.CNMatricula.getValorImpostoRenda(matriculaSessao.MatriculaAluno, ano);
            if (valor > 0)
            {
                gerarDeclaracaoIR(valor);
            }
            else
            {
                ScriptManager.RegisterStartupScript(Page, Page.GetType(), "Alert", "bootbox.alert('Imposto de renda não disponível para o ano informado!', function() {});", true);
            }
        }

        public string getMesExtenso(int mes)
        {
            switch (mes)
            {
                case 1:
                    return "Janeiro";
                case 2:
                    return "Fevereiro";
                case 3:
                    return "Março";
                case 4:
                    return "Abril";
                case 5:
                    return "Maio";
                case 6:
                    return "Junho";
                case 7:
                    return "Julho";
                case 8:
                    return "Agosto";
                case 9:
                    return "Setembro";
                case 10:
                    return "Outubro";
                case 11:
                    return "Novembro";
                case 12:
                    return "Dezembro";
                default:
                    return "MÊS INVÁLIDO";
            }
        }

        private void gerarDeclaracaoIR(double valor)
        {
            DataTable dtCabecalho = ControlClass.CNParametros.getCabecalhoRelatorio();
            if (dtCabecalho.Rows.Count == 0)
                ScriptManager.RegisterStartupScript(Page, Page.GetType(), "Alert", "bootbox.alert('O relatório não poderá ser gerado pois, o cabeçalho do mesmo não foi configurado!', function() {});", true);
            else
            {
                ReportViewer ReportViewer1 = new ReportViewer();
                ReportViewer1.Reset();
                ReportViewer1.ProcessingMode = ProcessingMode.Local;
                ReportViewer1.LocalReport.ReportPath = Server.MapPath(@"~/Relatorios/DeclaracaoIR.rdlc");
                ReportViewer1.LocalReport.DataSources.Clear();
                MatriculaSessao matriculaSessao = (MatriculaSessao)Session["matriculaSessao"];
                ReportParameter rpCurso = new ReportParameter("rpCurso", Server.HtmlDecode(matriculaSessao.NomeCurso));
                ReportParameter rpValor = new ReportParameter("rpValor", Server.HtmlDecode(string.Format("{0:c}", valor.ToString())));
                string valorExtenso = Extenso.toExtenso(valor, Extenso.TipoValorExtenso.Monetario);
                ReportParameter rpValorExtenso = new ReportParameter("rpValorExtenso", Server.HtmlDecode(valorExtenso));
                ReportParameter rpAno = new ReportParameter("rpAno", Server.HtmlDecode(ddlAno.SelectedItem.Text));
                ReportParameter rpNome = new ReportParameter("rpNome", Server.HtmlDecode(matriculaSessao.NomeAlunoCompleto));
                ReportParameter rpMatricula = new ReportParameter("rpMatricula", Server.HtmlDecode(matriculaSessao.MatriculaAluno.ToString()));
                string mes = getMesExtenso(DateTime.Now.Month);
                ReportParameter rpMes = new ReportParameter("rpMes", Server.HtmlDecode(mes));

                ReportParameter[] ReportParans = new ReportParameter[] { rpCurso, rpValor, rpValorExtenso, rpAno, rpNome, rpMatricula, rpMes };
                ReportViewer1.LocalReport.SetParameters(ReportParans);



                ReportDataSource rds1 = new ReportDataSource();
                rds1.Name = "DataSet2";

                rds1.Value = dtCabecalho;

                ReportViewer1.LocalReport.DataSources.Clear();
                ReportViewer1.LocalReport.DataSources.Add(rds1);
                ReportViewer1.LocalReport.Refresh();

                #region Gerar PDF
                Warning[] warn = null;
                string[] streamids = null;
                string mimeType = "application/pdf";
                string encoding = string.Empty;
                string extension = string.Empty;
                byte[] byteViewer;

                byteViewer = ReportViewer1.LocalReport.Render("pdf", null, out mimeType, out encoding, out extension, out streamids, out warn);
                Response.Buffer = true;
                Response.Clear();
                Response.ContentType = "application/pdf";
                Response.AddHeader("content-disposition", "attachment; filename=DeclaracaoIR" + matriculaSessao.MatriculaAluno + ".pdf");
                Response.BinaryWrite(byteViewer);
                Response.Flush();

                Response.End();
                Response.ClearContent();
                #endregion
            }
        }
    }
}